package com.taotao.manage.service;

import java.lang.reflect.ParameterizedType;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.abel533.entity.Example;
import com.github.abel533.mapper.Mapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taotao.manage.pojo.BasePojo;

@Service
public  abstract class BaseService<T extends BasePojo>  {

	@Autowired
	private Mapper<T> mapper;  
	
	private Class<T> clazz;
	
	{
		//getGenericSuperclass()获得带有泛型的父类  
	     //Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
		//ParameterizedType参数化类型，即泛型  
		ParameterizedType  type = (ParameterizedType) this.getClass().getGenericSuperclass();
		//getActualTypeArguments获取参数化类型的数组，泛型可能有多个  
		clazz = (Class<T>) type.getActualTypeArguments()[0];
	}
	
	public abstract Mapper<T> getMapper();
		
	/**
	 * 根据主键查询
	 * @param id
	 * @return
	 */
	public T queryById(Long id){
		return mapper.selectByPrimaryKey(id);
	}
	
	/**
	 * 查询所有
	 * @param id
	 * @return
	 */
	public List<T> queryAll(){
		return mapper.select(null);
	}
	
	/**
	 * 查询一条记录
	 * @return
	 */
	public T queryOne(T record){
		return mapper.selectOne(record);
	}
	
	/**
	 * 根据条件查询信息
	 * 
	 * @return
	 */
	public List<T> queryListByWhere(T record){
		return mapper.select(record);
	}
	
	/**
	 * 根据条件分页查询
	 * 
	 * @param record
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public PageInfo<T> queryPageListByWhere(T record,Integer pageNum,Integer pageSize){
		PageHelper.startPage(pageNum,pageSize);
		List<T> list = mapper.select(record);
		return new PageInfo<T>(list);
	}
	
	/**
	 * 新增数据
	 * @param record
	 * @return
	 */
	public int save(T record){
		record.setCreated(new Date());
		record.setUpdated(record.getCreated());
		return mapper.insert(record);
	}
	
	/**
	 * 新增数据，新增不为null的字段
	 * @param record
	 * @return
	 */
	public int insertSelective(T record){
		record.setCreated(new Date());
		record.setUpdated(record.getCreated());
		return mapper.insertSelective(record);
	}
	
	/**
	 * 更新
	 * @param record
	 * @return
	 */
	public int update(T record){
		T t = mapper.selectByPrimaryKey(record);
		t.setUpdated(new Date());
		return mapper.updateByPrimaryKey(t);
	}
	
	/**
	 * 更新，不为null的字段
	 * @param record
	 * @return
	 */
	public int updateSelective(T record){
		record.setUpdated(new Date());
		record.setCreated(null);
		return mapper.updateByPrimaryKeySelective(record);
		
	}
	
	
	/**
	 * 根据id删除
	 * @param record
	 * @return
	 */
	public int deleteById(T record){
		return mapper.deleteByPrimaryKey(record);
	}
	
	/**
	 * 根据多个id删除用户信息
	 * @param record
	 * @return
	 */
	public int deleteByIds(List<Object> ids,String PrimaryKey){
		Example example =new Example(clazz);
		example.createCriteria().andIn(PrimaryKey, ids);
		return mapper.deleteByExample(example);
	}
	
	/**
	 * 根据条件删除记录
	 * @param record
	 * @return
	 */
	public int deleteByWhere(T record){
		return mapper.delete(record);
	}
	
	
/*	1、	queryById
	2、	queryAll
	3、	queryOne
	4、	queryListByWhere
	5、	queryPageListByWhere
	6、	save
	7、	update
	8、	deleteById
	9、	deleteByIds
	10、	deleteByWhere
*/
	
	
}
